/*
 * @lc app=leetcode.cn id=98 lang=cpp
 *
 * [98] 验证二叉搜索树
 *
 * https://leetcode-cn.com/problems/validate-binary-search-tree/description/
 *
 * algorithms
 * Medium (35.93%)
 * Likes:    1545
 * Dislikes: 0
 * Total Accepted:    490.8K
 * Total Submissions: 1.4M
 * Testcase Example:  '[2,1,3]'
 *
 * 给你一个二叉树的根节点 root ，判断其是否是一个有效的二叉搜索树。
 * 
 * 有效 二叉搜索树定义如下：
 * 
 * 
 * 节点的左子树只包含 小于 当前节点的数。
 * 节点的右子树只包含 大于 当前节点的数。
 * 所有左子树和右子树自身必须也是二叉搜索树。
 * 
 * 
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入：root = [2,1,3]
 * 输出：true
 * 
 * 
 * 示例 2：
 * 
 * 
 * 输入：root = [5,1,4,null,null,3,6]
 * 输出：false
 * 解释：根节点的值是 5 ，但是右子节点的值是 4 。
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 树中节点数目范围在[1, 10^4] 内
 * -2^31 <= Node.val <= 2^31 - 1
 * 
 * 
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

    //递归中序遍历
    // void traversal(TreeNode* root, vector<int>& res) {
    //     if(root == NULL) return;
    //     traversal(root->left, res);
    //     res.push_back(root->val);
    //     traversal(root->right, res);
    // }
    // bool isValidBST(TreeNode* root) {
    //     vector<int> res;
        
    //     traversal(root, res);

    //     for(int i = 1; i < res.size(); i++) {
    //         //要小于等于，二叉搜索树不能有相同的元素
    //         if(res[i] <= res[i-1]) return false;
    //     }

    //     return true;
    // }

    // //迭代遍历
    // bool isValidBST(TreeNode* root) {
    //     stack<TreeNode*> st;
    //     TreeNode* cur = root;
    //     TreeNode* pre = NULL;
    //     st.push(cur);
    //     while(!st.empty()) {
    //         cur = st.top();
    //         if(cur != NULL) {
    //             st.pop();
    //             if(cur->right) st.push(cur->right);
    //             st.push(cur);
    //             st.push(NULL);
    //             if(cur->left) st.push(cur->left);
    //         } else {
    //             st.pop();
    //             cur = st.top();
    //             st.pop();

    //             if(pre && cur->val <= pre->val) return false;
    //             pre = cur;
    //         }
    //     }
    //     return true;
    // }


    //递归直接判断，不需要用一个数组来单独判断。
    long long maxVal = LONG_MIN;
    bool isValidBST(TreeNode* root) { 
        if(root == NULL) return true;

        bool left = isValidBST(root->left);
        if(root->val > maxVal) maxVal = root->val;
        else return false;
        bool right = isValidBST(root->right);
        return left && right;
    }


};
// @lc code=end

